Note: Verified 3/10/2020 Updating an LX zone from an updated docker image is pretty simple; if you want to preserve data you'll need to do so before-hand, or have pre-configured your zone to store things in a delegated dataset, which will be preserved across reprovisions. The only real trick is that the reprovision will remove the init script we added to mount the delegated dataset and lofs-mount any directories into the filesystem. So, we'll make sure we put that back in, after the reprovision but before the zone is started back up. This procedure also makes a backup of the zone just in case things go badly. Note: though this is presented in the form of a shell script, DO NOT run it as such, but rather consider each line individually. Otherwise you'll likely trash your zone.
# import the new version of the image we want to run imgadm import analogic/poste.io # make note of the image uuid imported and set NEW_IMAGE to this value UUID=91854c5c-a285-6522-9da8-e38a04116fd6 NEW_IMAGE=some_uuid BACKUP_LOCATION=/zones/images/smtp-data.zfs SNAPSHOT_NAME=begin # stop the zone and make a copy of the zfs delegated setup script vmadm stop ${UUID} cp /zones/${UUID}/root/etc/cont-init.d/01-init-zfs.sh /tmp # this is not strictly necessary, but sometimes it's nice to have a backup. echo "Backing up to $BACKUP_LOCATION..." zfs snap zones/${UUID}/data@${SNAPSHOT_NAME} zfs send -Recv zones/${UUID}/data@begin > $BACKUP_LOCATION echo "Reprovisioning..." echo '{"image_uuid": "${NEW_IMAGE}"}' | vmadm reprovision ${UUID} # restore the zfs delegated dataset bootstrap and truncated directory setup # scripts back into place. this is because they have to run the first time, every # time and thus can't be installed from /data/_override (which is a feature that # poste.io provides for making customizations to their image, and which is not # a standard feature across docker images). # # alternatively, we could override the docker:cmd field and do something there # or build a custom docker image. vmadm stop ${UUID} cp /tmp/0*.sh /zones/${UUID}/root/etc/cont-init.d/ #If, for some reason the container starts up immediately after provision, the zfs init script won't work as #the /data directory will be present and non-empty. If this happens, move it out of the way and restart. # then, zlogin and verify that the /data directory has the delegated dataset (with the local and _override directories) vmadm start ${UUID} # to restart with ipf running we have to reboot. vmadm reboot ${UUID} # restoring the delegated dataset is not necessary when we use reprovision, but is # kept as an example of how to do it. zfs recv -F zones/${UUID}/data < ${BACKUP_LOCATION} zfs rollback zones/${UUID}/data@${SNAPSHOT_NAME} zfs destroy zones/${UUID}/data@${SNAPSHOT_NAME} rm ${BACKUP_LOCATION}